
#include "nane/CodecSystem/Sound/SoundDecoder.h"
#include "nane/CodecSystem/Sound/SoundDecoderImpl_.h"
#include "nane/CodecSystem/Sound/SoundCodecSystemImpl_.h"

#include "nane/core/assert.h"

namespace nane 
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    SoundDecoder::SoundDecoder( const NullType& )
        : SubSystemProduct()
        , m( NULL )
    {
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    SoundDecoder::SoundDecoder( Implementation* _impl )
        : SubSystemProduct( _impl )
        , m( _impl )
    {
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    SoundDecoder::SoundDecoder( const SoundDecoder& _other )
        : SubSystemProduct( _other )
        , m( _other.m )
    {
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 SoundDecoder::GetFrequency()
    {
        NANE_ASSERT_RV( m != NULL, "SoundDecoder must be valid", 0 );
        return m->interface->GetFrequency();
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint16 SoundDecoder::GetChannels()
    {
        NANE_ASSERT_RV( m != NULL, "SoundDecoder must be valid", 0 );
        return m->interface->GetChannels();
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint16 SoundDecoder::GetBitsPerSample()
    {
        NANE_ASSERT_RV( m != NULL, "SoundDecoder must be valid", 0 );
        return m->interface->GetBitsPerSample();
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 SoundDecoder::GetLengthInBytes()
    {
        NANE_ASSERT_RV( m != NULL, "SoundDecoder must be valid", 0 );
        return m->interface->GetLengthInBytes();
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 SoundDecoder::Read( byte* _buffer, uint32 _count )
    {
        NANE_ASSERT_RV( m != NULL, "SoundDecoder must be valid", 0 );
        return m->interface->Read(_buffer, _count);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
